#include <iostream>
using namespace std;

#define MAXSIZE 6

typedef int QElemType;

typedef struct {
    QElemType * base;	// 动态分配存储空间
    int front;	// 头指针，指向对头元素
    int rear;	// 尾指针，指向队尾元素的下一个位置
} SqQueue;


bool InitQueue(SqQueue &Q)
{
    Q.base = (QElemType *) malloc(MAXSIZE * sizeof(QElemType)); // 为队列分配一个容量为MAXSIZE的数组空间
    if (!Q.base)            // 存储分配失败
        return false;
    Q.front = Q.rear = 0;
    return true;
}

bool IsEmpty(SqQueue &Q)
{
    if (Q.front == Q.rear)
        return true;
    else
        return false;
}

// 判断是否满队列，少用一个元素空间
bool IsFull(SqQueue &Q)
{
    if ((Q.rear+1) % MAXSIZE == Q.front)
        return true;
    else 
        return false;
}

// 进队列
bool EnQueue(SqQueue &Q， QElemType &e)
{ 
    if ((Q.rear + 1) % MAXSIZE == Q.front) // 队满
        return false;
    Q.base[Q.rear] = e;                 // 新元素加入队尾
    Q.rear = (Q.rear + 1) % MAXSIZE;    // 队尾指针+1
    return true;
}

// 出队列
bool DeQueue(SqQueue &Q, QElemType &e)
{
    if (Q.front == Q.rear)  // 队空
        return false;
    e = Q.base[Q.front];    // 保存队头元素
    Q.front = (Q.front + 1) % MAXSIZE;  // 队头指针+1
    return true;
}

// 求队列长度
int QueueLength(SqQueue &Q)
{
    return ((Q.rear - Q.front + MAXSIZE) % MAXSIZE);
}

// 取队头
QElemType GetHead(SqQueue Q)
{
    if (Q.rear != Q.front) // 队空不为空
        return Q.base[Q.front]; // 返回对头指针元素的值
}